package com.odontosis.relatorio.isencaoperiodo;

import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.PdfWriter;
import com.odontosis.entidade.Mes;
import com.odontosis.entidade.Paciente;
import com.odontosis.entidade.Pagamento;
import com.odontosis.entidade.Recibo;
import com.odontosis.ioc.ContainerIoc;
import com.odontosis.service.PagamentoService;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisAction;

public class AcaoRelatorioIsencao extends OdontosisAction<PagamentoService> {
	
	/**
	 * Mtodo principal da ao. 
	 */
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRelatorioIsencao formRelatorio = (FormRelatorioIsencao) actionForm;

		if(!StringUtilsOdontosis.isVazia(formRelatorio.getMetodo()) && formRelatorio.getMetodo().equals("visualizar")) {
			return onVisualizar(mapping, actionForm, request, response);
		}
		return super.execute(mapping, actionForm, request, response);
	}
	
	public ActionForward onVisualizar(ActionMapping mapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRelatorioIsencao formRelatorio = (FormRelatorioIsencao) actionForm;
		
		
		Calendar inicio = Calendar.getInstance();
		inicio.set(Calendar.DATE, 1);
		inicio.set(Calendar.MONTH, Integer.parseInt(formRelatorio.getMesInicial()) -1);
		inicio.set(Calendar.YEAR, Integer.parseInt(formRelatorio.getAnoInicial()));
		
		Calendar fim = Calendar.getInstance();
		int anoFinal = Integer.parseInt(formRelatorio.getAnoFinal());
		int dataFinal = 31;
		int mesFinal = Integer.parseInt(formRelatorio.getMesFinal()); 
		switch (mesFinal) {
		case 2:
			dataFinal = (anoFinal % 4 == 0)? 29 : 28;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			dataFinal = 30;
			break;
		default:
			break;
		}
		fim.set(Calendar.DATE, dataFinal);
		fim.set(Calendar.MONTH, Integer.parseInt(formRelatorio.getMesFinal()) - 1);
		fim.set(Calendar.YEAR, Integer.parseInt(formRelatorio.getAnoFinal()));
		
		
		gerarRelatorio(inicio.getTime(), fim.getTime() , formRelatorio.getPaciente(), response);
		
		return null;
	}
	
	
	public void gerarRelatorio(Date inicio, Date fim, String nomePaciente, HttpServletResponse response){
		try{
			//fontes
			Font fontItem = new Font(Font.HELVETICA, 10, Font.NORMAL);
	        Font fontTotal = new Font(Font.HELVETICA, 10, Font.BOLD);
	        Font fonteTitulo = new Font(Font.HELVETICA, 11, Font.BOLD);
	        Font fonteCabecalho = new Font(Font.HELVETICA, 13, Font.BOLD);
	        
			//inicializa documento
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			Document document = new Document();
			PdfWriter.getInstance(document, baos);
			document.open();
			
			//Collection<ServicoConveniado> resultado = service.pesquisarPorDataECodigo(inicio, fim, codigoProcedimento);
			Collection<Pagamento> pagamentos = service.buscarParcelasIsentasPorPeriodo(inicio, fim, null, nomePaciente); 
			//define o titulo
			SimpleDateFormat formata = new SimpleDateFormat("dd/MM/yyyy");
			String dataInicio = formata.format(inicio.getTime());
			String dataFim = formata.format(fim.getTime());
			
			String periodo = "de "+ dataInicio + " até "+ dataFim;
			Paragraph paragrafoTitulo = new Paragraph(new Phrase("Relatório de Isenções \n  "+periodo, fonteCabecalho));
            paragrafoTitulo.setAlignment(1);
            document.add(paragrafoTitulo);
			
			//cria a tabela
			float [] tamanhos = {3,1f,1.4f,1.4f,0.8f,0.7f};
			Table table = criarObjetoTabela(6, tamanhos);
			
			Cell t4 = new Cell(new Phrase("Paciente", fonteCabecalho));
			t4.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t4);
			
			Cell t1 = new Cell(new Phrase("Tipo do Serviço", fonteCabecalho));
			t1.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(t1);
			
			Cell t3 = new Cell(new Phrase("Vencimento", fonteCabecalho));
			t3.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t3);
			
			Cell t7 = new Cell(new Phrase("Justificativa", fonteCabecalho));
			t7.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t7);
			
			Cell t6 = new Cell(new Phrase("Isento por", fonteCabecalho));
			t6.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t6);
			
			Cell t2 = new Cell(new Phrase("Valor", fonteCabecalho));
			t2.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t2);
			
			
			
			
			double total = 0.0;
			double totalDevedor = 0.0;
			for (Pagamento pagamento : pagamentos) {
				    
					Paciente paciente = pagamento.getServico().getPacienteServico();
					Cell pacienteCell = new Cell(new Phrase(StringUtilsOdontosis.colocaZeros(paciente.getNumeroPasta(),10) + " - " +paciente.getNome(), fontItem));
					table.addCell(pacienteCell);
					
					Cell tiposervico = new Cell(new Phrase(pagamento.getServico().getTipoServico().getDescricao(), fontItem));
					table.addCell(tiposervico);
					
					Cell ano = new Cell(new Phrase(Mes.recuperarPorId(pagamento.getMesVencimento()).getDescricao() + "/" + pagamento.getAnoVencimento(), fontItem));
					table.addCell(ano);
					
					double valorPagamento = 0.0;
					double valorParcela = 0.0;
					if(pagamento.getListaRecibos() != null && !pagamento.getListaRecibos().isEmpty()){
						for (Recibo recibo : pagamento.getListaRecibos()) {
							if(recibo.isAtivo()){
								valorPagamento += recibo.getValor().doubleValue();
							}
						}
					}else{
						valorPagamento = 0.0;
					}
					
					Cell justificativa = new Cell(new Phrase(pagamento.getJustificativa(), fontItem));
					table.addCell(justificativa);
					
					String nome = pagamento.getUsuarioCancelamento() != null ? pagamento.getUsuarioCancelamento().getNome() : " - ";
					Cell pago = new Cell(new Phrase(nome, fontItem));
					table.addCell(pago);
					
					valorParcela = valorPagamento + pagamento.getValor().doubleValue();
					Cell valor = new Cell(new Phrase(StringUtilsOdontosis.formatarDouble(valorParcela), fontItem));
					table.addCell(valor);
					
					total += valorParcela;
					
				
			}
			
			Cell rodape = new Cell(new Phrase("Total"));
			rodape.setColspan(5);
			rodape.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(rodape);
			
			Cell totaliza = new Cell(new Phrase(StringUtilsOdontosis.formatarDouble(total),fontTotal));
			totaliza.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(totaliza);
			
			
			
			document.add(table);
			document.close();
			response.setContentType("application/pdf");
			response.setContentLength(baos.size());
			ServletOutputStream out = response.getOutputStream();
			baos.writeTo(out);
			out.flush();
			
		
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	
	private Table criarObjetoTabela(int numColunas, float[] headerWidths) {
	        try {
	            Table aTable = new Table(numColunas);

	            aTable.setPadding(1);
	            aTable.setSpacing(0);

	            aTable.setWidths(headerWidths);

	            aTable.widthPercentage();
	            aTable.setWidth(100);
	            aTable.setBorder(0);

	            aTable.setSpaceBetweenCells(0);

	            aTable.setDefaultCellBorderWidth(0);
	            aTable.setBorder(0);

	            return aTable;
	        } catch (BadElementException e) {
	            throw new RuntimeException("Erro definindo largura do cabeçalho", e);
	        }
	    }

}
